package org.facyt.vacas.entities.vacas;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.facyt.vacas.entities.vacas.restricciones.Restriccion;
import org.facyt.vacas.entities.vacas.restricciones.RestriccionRango;



@Entity
@Table(name = "alimento", schema="vacas")
public class Alimento implements Serializable {

	@Id
	@SequenceGenerator(name="alimento_seq", sequenceName="vacas.alimento_id_seq")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="alimento_seq")
	@Column(name = "id")
	private Integer id;

	@ManyToOne()
	@JoinColumn(name = "fk_etapa")
	private Etapa etapa;

	
	@ManyToOne()
	@JoinColumn(name = "fk_cvenergia")
	private Componente cvenergia;

	@ManyToOne()
	@JoinColumn(name = "fk_cvproteina")
	private Componente cvproteina;

	@ManyToOne()
	@JoinColumn(name = "fk_cvfosforo")
	private Componente cvfosforo;

	@Column(name = "min_calcio")
	private Float minCalcio;

	@Column(name = "max_calcio")
	private Float maxCalcio;

	@Column(name = "min_energia")
	private Float minEnergia;

	@Column(name = "max_energia")
	private Float maxEnergia;

	 @OneToMany(fetch=FetchType.LAZY,mappedBy="alimento",cascade=CascadeType.ALL)   
     private List<Restriccion> requerimientos = new ArrayList<Restriccion>();			
			
	public void setRequerimientos(List<Restriccion> requerimientos) {
		
		this.requerimientos = requerimientos;
	}

	public List<Restriccion> getRequerimientos() {

		return requerimientos;
	}

	public Componente getCvproteina() {
		return cvproteina;
	}

	public void setCvproteina(Componente cvproteina) {
		this.cvproteina = cvproteina;
	}

	public Componente getCvfosforo() {
		return cvfosforo;
	}

	public void setCvfosforo(Componente cvfosforo) {
		this.cvfosforo = cvfosforo;
	}

	public Etapa getEtapa() {
		return etapa;
	}

	public void setEtapa(Etapa etapa) {
		this.etapa = etapa;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Componente getCvenergia() {
		return cvenergia;
	}

	public void setCvenergia(Componente cvenergia) {
		this.cvenergia = cvenergia;
	}

	public Float getMinCalcio() {
		return minCalcio;
	}

	public void setMinCalcio(Float minCalcio) {
		this.minCalcio = minCalcio;
	}

	public Float getMaxCalcio() {
		return maxCalcio;
	}

	public void setMaxCalcio(Float maxCalcio) {
		this.maxCalcio = maxCalcio;
	}

	public Float getMinEnergia() {
		return minEnergia;
	}

	public void setMinEnergia(Float minEnergia) {
		this.minEnergia = minEnergia;
	}

	public Float getMaxEnergia() {
		return maxEnergia;
	}

	public void setMaxEnergia(Float maxEnergia) {
		this.maxEnergia = maxEnergia;
	}

public Restriccion getRestriccionSimple(ArrayList listarequerimientos, Componente compo) {
		
		Iterator iterador = listarequerimientos.iterator();
		Restriccion rs = null;
		Componente c;
		boolean encontrado = false;
		while (iterador.hasNext() && !encontrado) {
			Restriccion r = (Restriccion) iterador.next();

			if (r.esSimple()) {
				c = ((Componente) ((org.facyt.vacas.entities.vacas.restricciones.RestriccionSimple) r).getComponenteById());
				
				if (c.equals(compo)) {
					rs = (Restriccion) r;
					encontrado = true;
				}

			}
		}
		return rs;
	}

public Restriccion getRestriccionRango(	ArrayList<Restriccion> listarequerimientos, Componente compo) {
	Iterator iterador = listarequerimientos.iterator();
	Restriccion rs = null;
	Componente c;
	boolean encontrado = false;
	while (iterador.hasNext() && !encontrado) {
		Restriccion r = (Restriccion) iterador.next();

		if (r.esRango()) {
			c = ((Componente) ((org.facyt.vacas.entities.vacas.restricciones.RestriccionRango) r).getComponenteById());
			
			if (c.equals(compo)) {
				rs = (Restriccion) r;
				encontrado = true;
			}

		}
	}
	return rs;
}
}
